package com.ces.chain;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollectionUtil;
import org.springframework.core.annotation.Order;

import java.util.ArrayList;
import java.util.List;

/*
 * @Author wuchengcheng
 * @Date 2019-10-13 15:43
 */
// 代理对象责任链，即责任链的启动类
public class ProxyChain<T> {

    private final List<Interceptor> interceptors = new ArrayList<>();

    // 加载、执行所有的代理并返回目标对象
    @SuppressWarnings("unchecked")
    public T all(T target) {
        // 根据Order注解，对代理对象进行排序
        interceptors.sort((a, b) -> {
            Order ao = AnnotationUtil.getAnnotation(a.getClass(), Order.class);
            Order bo = AnnotationUtil.getAnnotation(b.getClass(), Order.class);
            return null != ao && null != bo ? ao.value() - bo.value() : 0;
        });
        // 排序倒置（在代理集合中执行责任链时，是倒序处理“参考递归原理，即最后被调用的方法最先执行，然后层层退出”）
        final List<Interceptor> reverse = CollectionUtil.reverse(interceptors);
        //
        for (Interceptor interceptor : reverse) {
            // 此处的“apply”即“Chain.wrap”
            target = (T) interceptor.apply(target);
        }
        return target;
    }

    public void addInterceptor(Interceptor interceptor) {
        interceptors.add(interceptor);
    }

    public List<Interceptor> getInterceptors() {
        return interceptors;
    }
}
